package logic.file;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

import logic.FileSystemFactory;

//TODO raczej kompozycja na klasie bazowej wyprowadzonej z klasy abstrakcyjnej implementującej interfejs IFIle
public class LocalDirectory extends LocalFile implements IDirectory {
	
	List<String> fileList = new ArrayList<String>();

	public LocalDirectory(String path) {			//spr., ale najlepiej by byl prawdop. dotep pakietowy, 
													//instancjonowanie tylko przez fabryke
		super(path);
		fileList = Arrays.asList(file.list());
	}

	@Override
	public Iterator<IFile> iterator() {
		return listFiles().iterator();
	}

	@Override
	public List<String> getFiles() {
		return fileList;
	}

	@Override
	public int getFilesCount() {
		return fileList.size();
	}	
	
	public String toString() {
		return fileList.toString();
	}

	@Override
	public String getFile(int index) {
	// TODO Auto-generated method stub
	return null;
	}

	@Override
	public List<IFile> listFiles() {
		String [] fileNames = file.list();
		List<IFile> dirList = new ArrayList<IFile>();
		for (String name : fileNames) {
			dirList.add( FileSystemFactory.getElement(file.getAbsolutePath(), name) );
		}
		return dirList;
	}

	@Override
	public long calcDirSize() {		//metoda pokazuje koniecznosc klasy abstrakcyjnej dla Directory, 
									//implementujacej interfejs IDirectory oraz definiującej funkcje 
									//operujące na funkcjach zdefiniowanych w ramach interfejsu
									//TODO ew. wersja iteracyjna - rekurencja nie jest najbezpiecznijeszym wyjsciem
		List<IFile> filesInDir = listFiles();
		long sizeSum = 0;
		for (IFile file : filesInDir) {
			if (!(file instanceof IDirectory)) {
				sizeSum += file.getSize();
			} else {
				sizeSum += ( (IDirectory) file).calcDirSize();
			}
		}
		return sizeSum;
	}
	//'unit testing'
	public static void main(String[] args) {
		LocalDirectory dir = new LocalDirectory("/java");
		long calculatedSize = dir.calcDirSize();
		assert calculatedSize == 84971320309L : "calculated = " + calculatedSize;								//-ea jvm
	}

}
